﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Xml.Serialization;

namespace Colonisator.Classes
{
    /// <summary>
    /// Classe abstraite, ancêtre des joueurs humains, joueurs IA et factions IA
    /// </summary>
    [Serializable]
    public abstract class Joueur
    {
        public string NomJoueur { get; set; }
        public Color CouleurJoueur { get; set; }

        /// <summary>
        /// Liste des îles appartenant au joueur
        /// </summary>
        public List<Ile> Proprietes { get; set; }

        /// <summary>
        /// navire appartenant au joueur
        /// </summary>
        public List<Navire> Navires { get; set; }

        /// <summary>
        /// Trace tous les évènements marquants du joueur
        /// </summary>
        public List<Evenement> Evenements { get; set; }

        /// <summary>
        /// Points acquis dans toutes sortes de situations.
        /// </summary>
        public Int32 Experience { get; set; }

        /// <summary>
        /// Liste des cartes en main
        /// </summary>
        public List<Carte> Cartes { get; set; }

        /// <summary>
        /// Donne les valeurs de réputation que le joueur entretient avec les autres joueurs (incluant les factions)
        /// </summary>
        public Reputations ReputationsJoueur { get; set; }

        /// <summary>
        /// Représente la doctrine choisie par le joueur
        /// </summary>
        public Doctrine DoctrineAdoptee { get; set; }

        /// <summary>
        /// calcule le nombre total de points du joueur
        /// </summary>
        public int Points
        {
            get
            {
                return 0;
            }
        }
        
        /// <summary>
        /// Constructeur par défaut
        /// </summary>
        public Joueur()
        {
            NomJoueur = "";
            CouleurJoueur = new Color();
            Proprietes = new List<Ile>();
            Navires = new List<Navire>();
            Evenements = new List<Evenement>();
            Cartes = new List<Carte>();
            ReputationsJoueur = new Reputations();
        }

        #region Actions réalisables par un joueur
        
        /// <summary>
        /// Action de colonisation d'une île
        /// </summary>
        /// <param name="uneIle"></param>
        /// <param name="TableADeposer"></param>
        public void ColoniserIle(IleColonisable uneIle, TableDeBord TableADeposer)
        {
            // Transfert de la table de bord
            this.Navires[0].Table.MAJTableDeBordSelonDelta(TableADeposer, false);
            uneIle.Presence = TableADeposer;

            // Propriété
            this.Proprietes.Add(uneIle);

            // Expérience
            this.Experience += 30;

            // Influence à bord
            this.Navires[0].Table.Influence += 30;

            // Evenement
            this.Evenements.Add(new Evenement
            {
                TypeEvent = TypeEvenement.ColonisationIle,
                ExperienceAcquise = 30,
                TourAssocie = Partie.GetInstance().DonnerTourCourant(),
                IleAssociee = uneIle,
                JoueurAssocie = this
            });
        }

        /// <summary>
        /// Action d'acheter des actionns du CUII
        /// </summary>
        /// <param name="quantite">la quantité d'actions</param>
        public void AcheterActionsCUII(int quantite)
        {           
            int deltaDodris = Partie.GetInstance().EconomiePartie.OperationAchatActions(quantite);
            this.Navires[0].Table.Dodris -= deltaDodris;

            this.Evenements.Add(new Evenement
            {
                TypeEvent = TypeEvenement.AchatActionsCUII,
                ExperienceAcquise = 1,
                TourAssocie = Partie.GetInstance().DonnerTourCourant(),
                JoueurAssocie = this,
                DeltaDodris = deltaDodris
            });
        }

        /// <summary>
        /// Action de vendre des actionns du CUII
        /// </summary>
        /// <param name="quantite">la quantité d'actions</param>
        public void VendreActionsCUII(int quantite)
        {
            int deltaDodris = Partie.GetInstance().EconomiePartie.OperationVentechatActions(quantite);
            this.Navires[0].Table.Dodris += deltaDodris;

            this.Evenements.Add(new Evenement
            {
                TypeEvent = TypeEvenement.VenteActionsCUII,
                ExperienceAcquise = 1,
                TourAssocie = Partie.GetInstance().DonnerTourCourant(),
                JoueurAssocie = this,
                DeltaDodris = deltaDodris
            });
        }

        #endregion
    }

}
